卷积在图像处理中经常用到,其会根据每个像素周围的像素点修改当前像素点的值。卷积核就是用来描述每个像素点如何被附近的像素点所影响。例如,模糊滤波中,使用平均的权重方式来进行计算,这样差异比较大的像素点会减少差异。对于相同的图像,如果想要做不同的操作,我们只需要变化滤波器即可,这样就能做锐化、模糊、边缘增强和图像压花。
卷积算法会遍历原始图像中的每一个像素点。对于每个原始像素点,滤波器中心点会为于像素点的上方,然后将中心点以及周围点的像素点与滤波器中对应的权重值相乘。然后将乘积的结果值相加后,产生出新的值作为输出。图4.3中就展示了该算法的具体过程。
图4.3 卷积滤波如何对原图像进行处理。
图4.4a是原始图,图4.4b中展示了原图经过模糊滤波后的结果,图4.4c展示了经过一个压花滤波器处理后的结果。
图4.4 不同卷积核对同一张图像进行处理:a)为原图;b)为模糊处理;c)为压花处理。
程序清单4.6中使用C/C++实现了一个串行的卷积操作。两层外部循环以遍历原始图像中所有的像素点。每一次滤波操作,每个原始点和其附近的点都要参与计算。需要注意的是,滤波器有可能访问到原始图像之外的区域。为了解决这个问题,我们在最内层循环中添加了四个显式的检查,当滤波器对应的坐标点位于原始图像之外,我们将使用与其最近的原始图像的边界值。
/* Iterate over the rows of the source image */for (int i = 0; i